package com.distributeredis.redis_springboot.springaop;

import com.distributeredis.redis_springboot.springaop.controller.TestAop;
import com.distributeredis.redis_springboot.springaop.impl.LogServiceImpl;
import com.distributeredis.redis_springboot.springaop.vo.Person;
import com.distributeredis.redis_springboot.springaop.vo.User;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;

/**
 *      *：单个独立的任意符号，可以独立出现，也可以作为前缀或者后缀的匹配符出现
 *      execution(public * com.itheima.*.UserService.find*(*))  匹配com.itheima包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法
 *
 *      ..:多个连续的任意符号，可以独立出现，（参数一般使用..)
 *      execution(public User com..UserService.findById(..))  匹配com包下的任意包中的UserService类或接口中所有名称为findById的方法
 *
 */
@Component
@Aspect
public class MyLogAspect2 {
    // 设置切入点
    @Pointcut("execution(* com.distributeredis.redis_springboot.springaop.controller.TestAop.*(..))")
    private void pttt(){}

    @Autowired
    private TestAop testAop;

    @Around("pttt()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        // 通过aop去除空格
        Object[] args = joinPoint.getArgs();
        Signature signature = joinPoint.getSignature();
        String declaringTypeName = signature.getDeclaringTypeName();
        Class<?> aClass = Class.forName(declaringTypeName);

        Class<?> aClass1 = Class.forName("com.distributeredis.redis_springboot.springaop.impl.LogServiceImpl");
        Method declaredMethod = aClass1.getDeclaredMethod("logTest2", String.class, String.class);
        Constructor<?> constructor = aClass1.getConstructor();
        Object o = constructor.newInstance();
        declaredMethod.setAccessible(true);
        declaredMethod.invoke(o,"aaa","bbb");
//        Method[] declaredMethods = aClass.getDeclaredMethods();

        Object proceed = joinPoint.proceed(args);
        return proceed;
    }

}
